﻿/*
World of Monsters .NET
Copyright (c) 2011 Jakub "Cubix651" Cisło - http://cubix.one.pl

License: X11 (MIT) See README file.
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace World_of_Monsters.NET
{
    public partial class OknoGry : Form
    {
        #region ZMIENNE
        //enumeracja postaci
        enum Postac { Cubix, Wolverine };
        enum Poruszanie { dodajX, dodajY, odejmijX, odejmijY };

        //zmienne pomocnicze
        int aktualnaKlatka = 0;
        int aktualnaPozycjaX = 0;
        int aktualnaPozycjaY = 0;
        int maxPozycjaX;
        int maxPozycjaY;
        Postac wybranaPostac;

        //ścieżki zapisów
        string sciezkaZapisu = "saves\\";
        string[] sciezkaMapy = {
            "maps\\level1\\mapa.xml",
            "maps\\level2\\mapa.xml",
        };

        //zmienne graficzne
        Image[] cubixGo = new Image[13];
        Image[] wolverineGo = new Image[13];
        Image cubixFlowers;
        Image[] men = new Image[6];
        Image[,] monsters = new Image[3,26];
        Image home, grass, flowers, water;
        Image[] split = new Image[8];
        Image[,] mapa;
        #endregion

        public OknoGry()
        {
            InitializeComponent();

            //inicjalizacja obrazów
            for (int i = 0; i < 26; i++)
            {
                monsters[0, i] = Image.FromFile("images\\monsters\\level1\\monster (" + (i + 1) + ").bmp");
                if (i < 16)
                    monsters[1, i] = Image.FromFile("images\\monsters\\level2\\monster (" + (i + 1) + ").bmp");
                else
                    monsters[1, i] = null;
                if (i < 6)
                    monsters[2, i] = Image.FromFile("images\\monsters\\level3\\monster (" + (i + 1) + ").bmp");
                else
                    monsters[2, i] = null;
            }
            for (int i = 0; i < 13; i++)
            {
                cubixGo[i] = Image.FromFile("images\\cubix\\cubix-go (" + (i + 1) + ").png");
                wolverineGo[i] = Image.FromFile("images\\wolverine\\wolverine-go (" + (i + 1) + ").png");
            }
            for (int i = 0; i < 6; i++) men[i] = Image.FromFile("images\\textures\\man (" + (i + 1) + ").png");
            for (int i = 0; i < 8; i++) split[i] = Image.FromFile("images\\textures\\split (" + (i + 1) + ").png");
            home = Image.FromFile("images\\textures\\home.png");
            grass = Image.FromFile("images\\textures\\grass.png");
            flowers = Image.FromFile("images\\textures\\flowers.png");
            water = Image.FromFile("images\\textures\\water.png");
        }

        private void pokazPanel(Panel p)
        {
            pAnimacja.Visible = pMenu.Visible = pSklep.Visible = pWalka.Visible = pPlecak.Visible = pPoleGry.Visible = false;
            p.Visible = true;
        }

        //Obsługa menu gry
        #region MENU
        private void btnNowaGra_Click(object sender, EventArgs e)
        {
            pokazPanel(pWyborPostaci);
        }

        private void btnWczytaj_Click(object sender, EventArgs e)
        {
            Load wczytaj = new Load();
            wczytaj.ShowDialog(this);
        }

        private void btnZapisz_Click(object sender, EventArgs e)
        {
            Save zapisz = new Save();
            zapisz.ShowDialog(this);
        }

        private void btnUstawienia_Click(object sender, EventArgs e)
        {
            Ustawienia opcje = new Ustawienia();
            opcje.ShowDialog(this);
        }

        private void btnJakGrac_Click(object sender, EventArgs e)
        {
            JakGrac zasady = new JakGrac();
            zasady.ShowDialog(this);
        }

        private void btnAutor_Click(object sender, EventArgs e)
        {
            OProgramie o = new OProgramie();
            o.ShowDialog(this);
        }

        private void btnZakoncz_Click(object sender, EventArgs e)
        {
            Close();
        }
        #endregion

        //wczytywanie i zapisywanie xml
        #region XML
        private void wczytajMape(int poziom)
        {
            XmlTextReader xml;
            try
            {
                if (!System.IO.File.Exists(sciezkaMapy[poziom])) throw new Exception("Nie znaleziono pliku z mapą");
                else
                {
                    xml = new XmlTextReader(sciezkaMapy[poziom]);

                    xml.ReadStartElement("mapa");

                    xml.ReadStartElement("info");
                    xml.ReadStartElement("maxPoz");

                    maxPozycjaX = int.Parse(xml.ReadElementString("X"));
                    maxPozycjaY = int.Parse(xml.ReadElementString("Y"));
                    mapa = new Image[maxPozycjaX, maxPozycjaY];

                    xml.ReadEndElement();
                    xml.ReadStartElement("aktualPoz");

                    aktualnaPozycjaX = int.Parse(xml.ReadElementString("X"));
                    aktualnaPozycjaY = int.Parse(xml.ReadElementString("Y"));

                    xml.ReadEndElement();
                    xml.ReadEndElement();

                    xml.ReadStartElement("wyglad");

                    for (int x = 0; x < maxPozycjaX; x++)
                    {
                        xml.ReadStartElement("x" + x);

                        for (int y = 0; y < maxPozycjaY; y++)
                        {
                            int i = int.Parse(xml.ReadElementString("y" + y));

                            if (i == 0) mapa[x, y] = grass;
                            else if (i == 1) mapa[x, y] = flowers;
                            else if (i == 2) mapa[x, y] = water;
                            else if (i == 3) mapa[x, y] = home;
                            else if ((i >= 10) && (i <= 15)) mapa[x, y] = men[i - 10];
                            else if ((i >= 20) && (i <= 27)) mapa[x, y] = split[i - 20];
                        }

                        xml.ReadEndElement();
                    }

                    xml.ReadEndElement();
                    xml.ReadEndElement();
                    xml.Close();
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy odczytywaniu mapy\n\n" + exc.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void wczytajZapis()
        {

        }

        private void zapiszZapis()
        {

        }
        #endregion

        //wybór postaci, przy pierwszym uruchomieniu; możliwości: cubix i wolverine
        #region WYBÓR POSTACI
        private void pbxCubix_Click(object sender, EventArgs e)
        {
            wybranaPostac = Postac.Cubix;
            wczytajMape(0);
            pbxPostac.Image = cubixGo[0];
            inicjalizacjaMapy();
            pokazPanel(pPoleGry);
        }

        private void pbxWolverine_Click(object sender, EventArgs e)
        {
            wybranaPostac = Postac.Wolverine;
            wczytajMape(0);
            pbxPostac.Image = wolverineGo[0];
            inicjalizacjaMapy();
            pokazPanel(pPoleGry);
        }
        #endregion

        //obsługa zdarzeń formy(naciśnięcie klawiszy)
        #region ZDARZENIA
        private void OknoGry_KeyUp(object sender, KeyEventArgs e)
        {
            if (pPoleGry.Visible)
            {
                if (e.KeyCode == Keys.Up && (aktualnaPozycjaY < (maxPozycjaY - 3)))
                    zmianaPozycji(Poruszanie.dodajY);

                if (e.KeyCode == Keys.Down && (aktualnaPozycjaY > 2))
                    zmianaPozycji(Poruszanie.odejmijY);

                if (e.KeyCode == Keys.Left && (aktualnaPozycjaX > 2))
                    zmianaPozycji(Poruszanie.odejmijX);

                if (e.KeyCode == Keys.Right && (aktualnaPozycjaX < (maxPozycjaX - 3)))
                    zmianaPozycji(Poruszanie.dodajX);

                if (e.KeyCode == Keys.Z)
                {

                }
            }

            if (pWalka.Visible)
            {

            }
        }
        #endregion

        //Poruszanie się postacią
        #region CHODZENIE
        private void zmianaPozycji(Poruszanie p)
        {
            tmrAnimacja.Enabled = true;
            if (p == Poruszanie.dodajX) aktualnaPozycjaX++;
            else if (p == Poruszanie.dodajY) aktualnaPozycjaY++;
            else if (p == Poruszanie.odejmijX) aktualnaPozycjaX--;
            else if (p == Poruszanie.odejmijY) aktualnaPozycjaY--;

            if (mapa[aktualnaPozycjaX, aktualnaPozycjaY] == flowers)
            {
                if (wybranaPostac == Postac.Cubix) ;
            }
            for(int i = 0; i < 6; i++)
            {
                if (mapa[aktualnaPozycjaX, aktualnaPozycjaY] == men[i])
                    MessageBox.Show("WALKA");
            }

            inicjalizacjaMapy();
        }

        private void inicjalizacjaMapy()
        {
            pbxPole11.Image = mapa[aktualnaPozycjaX - 2, aktualnaPozycjaY - 2];
            pbxPole12.Image = mapa[aktualnaPozycjaX - 2, aktualnaPozycjaY - 1];
            pbxPole13.Image = mapa[aktualnaPozycjaX - 2, aktualnaPozycjaY];
            pbxPole14.Image = mapa[aktualnaPozycjaX - 2, aktualnaPozycjaY + 1];
            pbxPole15.Image = mapa[aktualnaPozycjaX - 2, aktualnaPozycjaY + 2];

            pbxPole21.Image = mapa[aktualnaPozycjaX - 1, aktualnaPozycjaY - 2]; ;
            pbxPole22.Image = mapa[aktualnaPozycjaX - 1, aktualnaPozycjaY - 1];
            pbxPole23.Image = mapa[aktualnaPozycjaX - 1, aktualnaPozycjaY];
            pbxPole24.Image = mapa[aktualnaPozycjaX - 1, aktualnaPozycjaY + 1];
            pbxPole25.Image = mapa[aktualnaPozycjaX - 1, aktualnaPozycjaY + 2];

            pbxPole31.Image = mapa[aktualnaPozycjaX, aktualnaPozycjaY - 2];
            pbxPole32.Image = mapa[aktualnaPozycjaX, aktualnaPozycjaY - 1];
            pbxPole33.Image = mapa[aktualnaPozycjaX, aktualnaPozycjaY]; //środek pola gry, ale niewidoczny
            pbxPole34.Image = mapa[aktualnaPozycjaX, aktualnaPozycjaY + 1];
            pbxPole35.Image = mapa[aktualnaPozycjaX, aktualnaPozycjaY + 2];

            pbxPole41.Image = mapa[aktualnaPozycjaX + 1, aktualnaPozycjaY - 2];
            pbxPole42.Image = mapa[aktualnaPozycjaX + 1, aktualnaPozycjaY - 1];
            pbxPole43.Image = mapa[aktualnaPozycjaX + 1, aktualnaPozycjaY];
            pbxPole44.Image = mapa[aktualnaPozycjaX + 1, aktualnaPozycjaY + 1];
            pbxPole45.Image = mapa[aktualnaPozycjaX + 1, aktualnaPozycjaY + 2];

            pbxPole51.Image = mapa[aktualnaPozycjaX + 2, aktualnaPozycjaY - 2];
            pbxPole52.Image = mapa[aktualnaPozycjaX + 2, aktualnaPozycjaY - 1];
            pbxPole53.Image = mapa[aktualnaPozycjaX + 2, aktualnaPozycjaY];
            pbxPole54.Image = mapa[aktualnaPozycjaX + 2, aktualnaPozycjaY + 1];
            pbxPole55.Image = mapa[aktualnaPozycjaX + 2, aktualnaPozycjaY + 2];
        }

        private void tmrAnimacja_Tick(object sender, EventArgs e)
        {
            if (wybranaPostac == Postac.Cubix)
                pbxPostac.Image = cubixGo[++aktualnaKlatka];
            else if (wybranaPostac == Postac.Wolverine)
                pbxPostac.Image = wolverineGo[++aktualnaKlatka];
            if (aktualnaKlatka == 12)
            {
                aktualnaKlatka = 0;
                tmrAnimacja.Enabled = false;
            }
        }
        #endregion
    }
}
